package ahp.client;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import ahp.client.layouts.KandydatkiLayout;
import ahp.client.layouts.KandydatkiPorownania;
import ahp.client.layouts.KategorieLayout;
import ahp.client.layouts.WynikLayout;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Main implements EntryPoint {

	public ArrayList<String> nazwyKategorii = new ArrayList<String>();
	public double[][] macierzPorownan;

	ArrayList<Osoba> wszystkie_kandydatki = new ArrayList<Osoba>();
	ArrayList<Osoba> wybrane_kandydatki = new ArrayList<Osoba>();
	ArrayList<Kategoria> kategorie = new ArrayList<Kategoria>();
	ArrayList<String> niespojne = new ArrayList<String>();
	Kategoria preferencje;
	TreeMap<String, Double> wynik;

	boolean flaga1 = true;
	boolean flaga2 = false;
	boolean flaga3 = false;
	boolean flaga4 = false;

	public final FlowPanel menuPanel = new FlowPanel();
	public Button[] navButtons = { makeButton("Pierwszy Etap"),
			makeButton("Drugi Etap"), makeButton("Trzeci Etap"),
			makeButton("Czwarty Etap"), };

	public final FlowPanel content = new FlowPanel();

	// pobranie layout
	KandydatkiLayout kandydatki;
	KategorieLayout kategorie_layout;
	KandydatkiPorownania kandydatkiPor_layout;

	public void onModuleLoad() {
		init();

		kandydatki = new KandydatkiLayout(wszystkie_kandydatki);

		menuPanel.setStyleName("main-menuPanel");
		content.setStyleName("content");
		RootPanel rootPanel = RootPanel.get("page");

		rootPanel.add(menuPanel);
		rootPanel.add(content);

		navButtons[0].removeStyleName("disabled");
		// dodaj przyciski
		for (int i = 0; i < navButtons.length; i++) {
			menuPanel.add(navButtons[i]);
			final int index = i;
			navButtons[i].addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					// TODO Auto-generated method stub
					changeView(index);
				}
			});
		}
		navButtons[0].click();

	}

	private void init() {
		// TODO Auto-generated method stub
		Osoba os = new Osoba("images/Emma_Watson.jpg", "Emma Watson");
		Osoba os2 = new Osoba("images/Kaley_Cuoco.jpg", "Kaley Cuoco");
		Osoba os3 = new Osoba("images/Olivia_Wilde.jpg", "Olivia Wilde");
		Osoba os4 = new Osoba("images/Natalie_Portman.jpg", "Natalie Portman");
		Osoba os5 = new Osoba("images/Penelope_Cruz.jpg", "Penelope Cruz");
		Osoba os6 = new Osoba("images/Keira_Knightley.jpg", "Keira Knightley");
		wszystkie_kandydatki.add(os);
		wszystkie_kandydatki.add(os2);
		wszystkie_kandydatki.add(os3);
		wszystkie_kandydatki.add(os4);
		wszystkie_kandydatki.add(os5);
		wszystkie_kandydatki.add(os6);

		nazwyKategorii.add("Figura");
		nazwyKategorii.add("Uśmiech");
		nazwyKategorii.add("Wdzięk");
		nazwyKategorii.add("Prezencja");
		nazwyKategorii.add("Elokwencja");
		nazwyKategorii.add("Elegancja");

		int size = nazwyKategorii.size();

		macierzPorownan = new double[size][size];
		for (int i = 0; i < macierzPorownan.length; i++) {
			for (int j = 0; j < macierzPorownan.length; j++) {

				macierzPorownan[i][j] = 1;
			}
		}
		kategorie_layout = new KategorieLayout(macierzPorownan, nazwyKategorii);

	}

	private Button makeButton(String label) {
		Button navButton = new Button(label);
		navButton.setStyleName("button");
		navButton.addStyleName("disabled");
		return navButton;
	}

	public void changeView(int event) {

		switch (event) {
		case 0:
			if (flaga1) {
				content.clear();
				content.add(kandydatki);
				flaga1 = false;
				flaga2 = true;
				navButtons[1].removeStyleName("disabled");
			}
			break;
		case 1:
			if (flaga2) {
				content.clear();
				content.add(kategorie_layout);
				if (kandydatki.selected.size() > 2) {
					wybrane_kandydatki = kandydatki.selected;
				} else {
					wybrane_kandydatki = wszystkie_kandydatki;
				}
				int size = wybrane_kandydatki.size();
				for (int i = 0; i < nazwyKategorii.size(); i++) {
					kategorie.add(new Kategoria(nazwyKategorii.get(i),
							new double[size][size]));
				}
				flaga2 = false;
				flaga3 = true;
				navButtons[2].removeStyleName("disabled");				
			}

			break;
		case 2:
			if (kategorie_layout.flaga) {
				content.clear();
				kandydatkiPor_layout = new KandydatkiPorownania(
						wybrane_kandydatki, kategorie);

				content.add(kandydatkiPor_layout);
				flaga3 = false;
				flaga4 = true;
				navButtons[3].removeStyleName("disabled");
			}

			break;

		case 3:
			if (kandydatkiPor_layout.flaga) {
				content.clear();
				flaga4 = false;
				System.out.println(" \nMacierz preferencji: ");
				for (int i = 0; i < kategorie.get(0).macierz.length; i++) {
					for (int j = 0; j < kategorie.get(0).macierz[i].length; j++) {
						System.out.print(kategorie.get(0).macierz[i][j] + "\t");
					}
					System.out.println("");

				}
				preferencje = new Kategoria("Preferencje", macierzPorownan);
				preferencje.licz_spojnosc();
				if (preferencje.wyznacznik > 0.1) {
					niespojne.add(preferencje.nazwa);
				}
				for (int i = 0; i < kategorie.size(); i++) {
					kategorie.get(i).licz_spojnosc();
                    if (kategorie.get(i).wyznacznik > 0.1) {
                        niespojne.add(kategorie.get(i).nazwa);
                    }					
				}
				obliczWektor();
				System.out.println(wynik);
				if (!niespojne.isEmpty()) {
					System.out
							.print("Wyniki moga odbiegac od oczekiwan ze wzgledu na niescislosci ocen kategorii: ");
					for (int i = 0; i < niespojne.size(); i++) {
						System.out.println(niespojne.get(i) + " ");
					}
				}
				WynikLayout wynLayout=new WynikLayout(niespojne,wynik,wybrane_kandydatki);
				content.add(wynLayout);
			}
		

		default:
			break;
		}
	}

	private void obliczWektor() {
		double factor;
		HashMap<String, Double> mapa = new HashMap<String, Double>();
		for (int i = 0; i < wybrane_kandydatki.size(); i++) {
			factor = 0;
			for (int j = 0; j < nazwyKategorii.size(); j++) {
				factor += preferencje.wektor_preferencji[j]
						* kategorie.get(j).wektor_preferencji[i];
			}
			mapa.put(wybrane_kandydatki.get(i).imie, factor);
		}
		wynik = new TreeMap<String, Double>(new MapComparator(mapa));
		wynik.putAll(mapa);

	}

	private class MapComparator implements Comparator<String> {

		Map<String, Double> baza;

		public MapComparator(Map<String, Double> base) {
			this.baza = base;
		}

		public int compare(String a, String b) {
			if (baza.get(a) >= baza.get(b)) {
				return -1;
			} else {
				return 1;
			}
		}
	}

}
